<?php

/**
 *  登陆页
 * @file    
 * @date    
 * @author  
 * @version    
 */

namespace app\users\controller;

use think\Request;
use think\Db;
use think\Session;
use think\Controller;
use think\Url;

class student extends Common {

    /**
     * 主页面
     */
    public function index() {
        return $this->fetch();
    }
    
    public function course_info() {
        $result=db("courses")->select();
        $this->assign('lists',$result);
        return $this->fetch();
    }
    
    public function change_password() {
        $data = input();
        if(!$data){
            return $this->fetch();
        }
        //判断原始密码是否正确
        $res=db('students')->field('stu_pwd')->where('stu_id',session('stu_id'))->find();
        $tem=$data['password0'].Session::get('stu_id');
        if(MD5($tem)!=$res['stu_pwd']){
            $this->error('修改失败，原始密码不正确!');
        }
        //判断两次密码是否一致
        if (!$data['password1']) {
           unset($data['password1']);
        } else {
            if ($data['password1'] != $data['password2']) {
                $this->error('两次密码不一致!');
            }
        }
        //判断新密码的安全性
        if(strlen($data['password1'])<6){
            $this->error('新密码的长度小于6，请重新设置!');
        }
        if($data['password1']==session('stu_id')||strrev(session('stu_id'))==$data['password1']){
            $this->error('新密码不能和账号或者账号的逆序相同!');
        }
        $count=0;
        if(preg_match('/[a-z]/',data['password1'])){
            $count=$count+1;
        }
        if(preg_match('/[A-Z]/',data['password1'])){
            $count=$count+1;
        }
        if(preg_match('/[0-9]/',data['password1'])){
            $count=$count+1;
        }
        if(preg_match('/[~!@#$%^&*()_+{}:|<>?,./;\'[]=`]/',data['password1'])){
            $count=$count+1;
        }
        if($count<2){
            $this->error('新密码必须至少包含一个小写字母、一个大写字母、一位数字和一位特殊字符中的其中两项');
        }

        $salt=session('stu_id');
        $data['password1'] = md5($data['password1'].$salt);
        $res = db::table('students')->where('stu_id',session('stu_id'))->update(['stu_pwd'=>$data['password1']]);
        if ($res) {
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'修改密码','result'=>'成功','user'=>session('stu_id')];
            db('logs')->insert($data);
           $this->success('密码修改成功，请重新登录',"Login/index");
        } else {
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'修改密码','result'=>'失败','user'=>session('stu_id')];
            db('logs')->insert($data);
           $this->error('修改失败');
        }
    }

    public function course_list(){
        $result=db("stu_courses")
            ->alias('s')
            ->join('courses c','s.course_id=c.course_id')
            ->where('stu_id',session('stu_id'))->select();
        $this->assign('lists',$result);
        return $this->fetch();
    }

    public function course_select(){
        $data = input();
        if(!$data){
            return $this->fetch();
        }
        //设置抢课时间
        if(date('Y-m-d H:i:s',time())<"2021-01-22 09:00:00"){
            $this->error('抢课时间未到！');
        }

        //判断输入的课程号是否合法，

        $res1=db('courses')->where('course_id',$data['course_id'])->find();
        if(!$res1){
            $this->error('该课程不存在，选课失败！');
        }


        if($res1['course_nums']<1){
            $this->error('该课程人数已达上限，选课失败');
        }
        //判断该学生是否已经选择了该课程
        $res1=db('stu_courses')->where('course_id',$data['course_id'])
            ->where('stu_id',session('stu_id'))->find();
        if($res1){
            $this->error('该学生已经选择该课程，请勿重复选择！');
        }

        //判断该学生对应的验证码是否正确
        $captcha=input("authcode");
        //验证
        if (!captcha_check($captcha)) {
            $this->error('验证码错误，选课失败！');
        }
        /*
        //若不利用RabbitMQ，直接取消这里的注释即可
        $info=['stu_id'=>session('stu_id'),'course_id'=>$data['course_id']];
        Db::startTrans();
        try{
            Db::table('stu_courses')->insert($info);
            Db::table('courses')->where('course_id',$info['course_id'])->setDec('course_nums');
            Db::commit(); // 提交事务
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'选课','result'=>'成功','user'=>session('stu_id')];
            db('logs')->insert($data);
            $this->success('选课成功'); //this->success() 这个函数的源码其实也是会抛出异常
        } catch (\think\Exception\DbException $e) {  //仅catch sql 异常
            Db::rollback(); // 回滚事务
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'选课','result'=>'失败','user'=>session('stu_id')];
            db('logs')->insert($data);
            $this->error('选课失败');
        }
        */

        //到此为止输入合法性判断完毕，保证提交到消息队列中的参数都是有效的，后面无需再判断
        //构造url，将表单中的数据放入url中
        $para='stu_id='.session('stu_id').'&course_id='.$data['course_id'];
        //参数检查完毕之后，将$data数据传入go程序中，go应用程序监听下面的端口和访问路径
        $this->redirect('http://localhost:8080/room/order?'.$para,200);
    }

    public function course_exit(){
        $data = input();
        if(!$data){
            return $this->fetch();
        }
        //判断输入的课程号是否合法，
        $res1=db('courses')->where('course_id',$data['course_id'])->find();
        if(!$res1){
            $this->error('该课程不存在，无法退课！');
        }
        //判断该学生是否已经选择了该课程
        $res1=db('stu_courses')->where('course_id',$data['course_id'])
            ->where('stu_id',session('stu_id'))->find();
        if(!$res1){
            $this->error('该学生未选择该课程，退课失败！');
        }
        Db::startTrans();
        try{
            Db::table('stu_courses')->where('course_id',$data['course_id'])->where('stu_id',session('stu_id'))->delete();
            Db::table('courses')->where('course_id',$data['course_id'])->setInc('course_nums');
            // 提交事务
            Db::commit();
            //this->success() 这个函数的源码其实也是会抛出异常
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'退课','result'=>'成功','user'=>session('stu_id')];
            db('logs')->insert($data);
            $this->success('退课成功');
        } catch (\think\Exception\DbException $e) {  //仅catch sql 异常
            // 回滚事务
            Db::rollback();
            $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'退课','result'=>'失败','user'=>session('stu_id')];
            db('logs')->insert($data);
            $this->error('退课失败');
        }
    }

    public function logout() {
        $data=['time'=>date('Y-m-d H:i:s',time()),'ip'=>request()->ip(),'event'=>'登出','result'=>'成功','user'=>session('stu_id')];
        db('logs')->insert($data);
        session('stu_id', null);
        $this->success('退出成功', 'login/index');
    }
    
}

